package les

class Integrante {

	Usuario usuario
	String nome
	String apelido
	Date nascimento
	String rua
	String numero
	String bairro
	String cidade
	String estado
	String cep
	String sexo
	List telefones = []
	String email
	List comunicacoes
	String instrumento
	Boolean ehBatizado = true
	Boolean fez1Comunhao = true
	Boolean ehCrismado = true
	String encontroFeito
	String outraReligiao
	String grupoJovem
	String comoSoube = 'Missa'
	String alergia
	String comidaNaoPode
	Boolean medicamentoHoraMarcada = false
	String nomePai
	String religiaoPai
	String nomeMae
	String religiaoMae
	String paisECC
	String atencaoEspecial
	String nomeAmigo
	String telefoneAmigo
	String pqDeseja
	Integrante conjuge
		
	static hasMany = [telefones:String, comunicacoes:String]
	
    static constraints = {
		nome(nullable: false, blank: false)
		nascimento(nullable: false)
		sexo(inList:['F','M'], nullable: false, blank: false)
		estado(inList:['', 'AC', 'AL', 'AP', 'AM', 'BA', 'CE', 'DF', 'ES', 'GO', 'MA', 'MT', 'MS', 'MG', 'PA', 'PB', 'PR', 'PE', 'PI', 'RJ', 'RN', 'RS', 'RO', 'RR', 'SC', 'SP', 'SE', 'TO'])
		email(email: true)
		cep(matches: '[0-9]{2}.[0-9]{3}-[0-9]{3}')
		usuario(nullable: true)
		apelido(nullable: true)
		rua(nullable: true)
		numero(nullable: true)
		bairro(nullable: true)
		cidade(nullable: true)
		estado(nullable: true)
		cep(nullable: true)
		sexo(nullable: true)
		email(nullable: true)
		instrumento(nullable: true)
		encontroFeito(nullable: true)
		outraReligiao(nullable: true)
		grupoJovem(nullable: true)
		alergia(nullable: true)
		comidaNaoPode(nullable: true)
		nomePai(nullable: true)
		religiaoPai(nullable: true)
		nomeMae(nullable: true)
		religiaoMae(nullable: true)
		paisECC(nullable: true)
		atencaoEspecial(nullable: true)
		nomeAmigo(nullable: true)
		telefoneAmigo(nullable: true)
		pqDeseja(nullable: true)
		conjuge(nullable: true)
    }
	
	public int idade() {
        Date hoje = new Date();
        Map diffMap =[:]
        Long difference = hoje.time - this.nascimento.time
        difference = difference / 1000
        diffMap.seconds = difference % 60
        difference = (difference - diffMap.seconds) / 60
        diffMap.minutes = difference % 60
        difference = (difference - diffMap.minutes) / 60
        diffMap.hours = difference % 24
        difference = (difference - diffMap.hours) / 24
        diffMap.years = (difference / 365).toInteger()
        return diffMap.years
    }
	
	public String toString(){
		return nome;
	}

	public boolean ehCoordenadorDoCirculo(Circulo circulo) {
		for (Integrante coordenador : circulo.coordenadores) {
			if (coordenador.nome == this.nome) {
				return true;
			}
		}
		return false;
	}
	
	public List circulosQueCoordena() {
		List circulos = new ArrayList();
		for (Circulo circulo : Circulo.findAll()) {
			for (Integrante coordenador : circulo.coordenadores) {
				if (coordenador.nome == this.nome) {
					circulos.add(circulo);
				}
			}
		}
		return circulos;
	}
	
	public List circulosQueEhMembro() {
		List circulos = new ArrayList();
		for (Circulo circulo : Circulo.findAll()) {
			for (Integrante integrante : circulo.membros) {
				if (integrante.nome == this.nome) {
					circulos.add(circulo);
				}
			}
		}
		return circulos;
	}
	
	public boolean ehCoordenadorDeCirculoDoIntegrante(Integrante outro) {
		for (Circulo circulo : this.circulosQueCoordena()) {
			for (Integrante integrante : circulo.membros) {
				if (integrante.nome == outro.nome) {
					return true;
				}
			}
			for (Integrante coordenador : circulo.coordenadores) {
				if (coordenador.nome == outro.nome) {
					return true;
				}
			}
		}
		return false;
	}
	
	public boolean ehCoordenadorDaEquipe(Equipe equipe) {
		for (Integrante coordenador : equipe.coordenadores) {
			if (coordenador.nome == this.nome) {
				return true;
			}
		}
		return false;
	}
	
	public List equipesQueCoordena() {
		List equipes = new ArrayList();
		for (Equipe equipe : Equipe.findAll()) {
			for (Integrante coordenador : equipe.coordenadores) {
				if (coordenador.nome == this.nome) {
					equipes.add(equipe);
				}
			}
		}
		return equipes;
	}
	
	public List equipesQueEhMembro() {
		List equipes = new ArrayList();
		for (Equipe equipe : Equipe.findAll()) {
			for (Integrante integrante : equipe.membros) {
				if (integrante.nome == this.nome) {
					equipes.add(equipe);
				}
			}
		}
		return equipes;
	}
	
	public boolean ehCoordenadorDeEquipeDoIntegrante(Integrante outro) {
		for (Equipe equipe : this.equipesQueCoordena()) {
			for (Integrante integrante : equipe.membros) {
				if (integrante.nome == outro.nome) {
					return true;
				}
			}
			for (Integrante coordenador : equipe.coordenadores) {
				if (coordenador.nome == outro.nome) {
					return true;
				}
			}
		}
		return false;
	}
	
	public boolean participaDoEncontro(Encontro encontro) {
		for (Equipe equipe : this.equipesQueEhMembro()) {
			if (equipe.encontro == encontro) {
				return true;
			}
		}
		for (Equipe equipe : this.equipesQueCoordena()) {
			if (equipe.encontro == encontro) {
				return true;
			}
		}
		for (Circulo circulo : this.circulosQueEhMembro()) {
			if (circulo.encontro == encontro) {
				return true;
			}
		}
		for (Circulo circulo : this.circulosQueCoordena()) {
			if (circulo.encontro == encontro) {
				return true;
			}
		}
		return false;
	}
	
	public String celulasDaConsulta(ArrayList<String> campos, boolean ehCoordenador) {
		String celulas = "<td align=\"left\">" + this.nome; 
		if (ehCoordenador) {
			celulas += " (Coord.)";
		}
		celulas += "</td>";
		for (String campo : campos) {
			celulas += "<td>"
			if (campo == "Apelido") {
				if (this.apelido) {
					celulas += this.apelido;
				}
			}
			else if (campo == "Data de nascimento") {
				celulas += this.nascimento.format("dd/MM/yyyy");
			}
			else if (campo == "Idade") {
				celulas += this.idade() + "";
			}
			else if (campo == "Endereço") {
				if (this.rua) {
					celulas += "Rua " + this.rua;
				}
				if (this.numero) {
					celulas += " " + this.numero;
				}
				if (this.bairro) {
					celulas += "<br/>Bairro " + this.bairro;
				}
				if (this.cep) {
					celulas += "<br/>CEP " + this.cep;
				}
				if (this.cidade && this.estado) {
					celulas += "<br/>" + this.cidade + " - " + this.estado;
				}
			}
			else if (campo == "Telefones") {
				String separacao = "";
				for (String telefone : this.telefones) {
					celulas += separacao + telefone;
					separacao = " / ";
				}
			}
			else if (campo == "E-mail") {
				if (this.email) {
					celulas += this.email;
				}
			}
			else if (campo == "Toca algum instrumento") {
				if (this.instrumento) {
					celulas += this.instrumento;
				}
			}
			else if (campo == "Nomes dos pais") {
				String separacao = "";
				if (this.nomePai) {
					celulas += this.nomePai;
					separacao = "<br/>";
				}
				if (this.nomeMae) {
					celulas += separacao + this.nomeMae;
				}
			}
			else if (campo == "Alergia") {
				if (this.alergia) {
					celulas += this.alergia;
				}
			}
			else if (campo == "Comida que não pode comer") {
				if (this.comidaNaoPode) {
					celulas += this.comidaNaoPode;
				}
			}
			else if (campo == "Medicamento com hora marcada") {
				if (this.medicamentoHoraMarcada) {
					celulas += "Sim";
				}
				else {
					celulas += "Não";
				}
			}
			else if (campo == "Precisa de atenção especial") {
				if (this.atencaoEspecial) {
					celulas += this.atencaoEspecial;
				}
			}
			else if (campo == "Equipes que já participou") {
				String separador = "";
				for (Equipe equipe : this.equipesQueCoordena()) {
					celulas += separador + equipe.nome + " (coord " + equipe.encontro + ")"
					separador = ", ";
				}
				for (Equipe equipe : this.equipesQueEhMembro()) {
					celulas += separador + equipe.nome + " (" + equipe.encontro + ")"
					separador = ", ";
				}
			}
			else if (campo == "Equipes que já coordenou") {
				String separador = "";
				for (Equipe equipe : this.equipesQueCoordena()) {
					celulas += separador + equipe.nome + " (" + equipe.encontro + ")"
					separador = ", ";
				}
			}
			else if (campo == "Ano que fez EJC") {
				if (this.circulosQueEhMembro().size() > 0) {
					celulas += this.circulosQueEhMembro()[0].encontro.dataInicio.format('yyyy');
				}
			}
			else if (campo == "Círculo que coordena") {
				if (this.circulosQueCoordena().size() > 0) {
					Circulo circulo = this.circulosQueCoordena()[0];
					celulas += circulo.nome + " (" + circulo.cor + " - " + circulo.encontro + ")"
				}
			}
			else if (campo == "Círculo de origem") {
				if (this.circulosQueEhMembro().size() > 0) {
					Circulo circulo = this.circulosQueEhMembro()[0];
					celulas += circulo.nome + " (" + circulo.cor + " - " + circulo.encontro + ")"
				}
			}
			celulas += "</td>";
		}
		return celulas;
	}
}
